/*-----------------------------------------------------------------------*/
/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */
/*-----------------------------------------------------------------------*/
#include "ff.h"			/* Obtains integer types */
#include "diskio.h"		/* Declarations of disk functions */
#include <stdio.h>
#include "gd32f30x.h"
#include "sfud.h"
#include "norflash_drv.h"
// 存储器驱动定义
#define DEV_NORFLASH	0	/* NOR Flash映射到物理驱动器0 */
#define DEV_MMC		1		/* 示例：MMC/SD卡映射到驱动器1 */
#define DEV_USB		2		/* 示例：USB设备映射到驱动器2 */

// 扇区参数（适配16MB、4KB扇区Flash）
#define DEV_NORFLASH_SECTOR_SIZE    4096    /* 扇区大小：4KB */
#define DEV_NORFLASH_SECTOR_COUNT   4096    /* 总扇区数：16MB / 4KB = 4096 */

#define USE_SFUD 1

/*-----------------------------------------------------------------------*/
/* 获取驱动器状态                                                        */
/*-----------------------------------------------------------------------*/
DSTATUS disk_status(BYTE pdrv)
{
    switch (pdrv) {
    case DEV_NORFLASH: {
        // 检查SFUD设备是否初始化成功（更严谨的状态判断）
        const sfud_flash* flash = sfud_get_device(0);
        if (flash != NULL && flash->init_ok) {
            return RES_OK;  // 设备就绪
        }
        return STA_NOINIT; // 设备未初始化
    }
    }
    return STA_NOINIT; // 设备未初始化
}

/*-----------------------------------------------------------------------*/
/* 初始化驱动器                                                          */
/*-----------------------------------------------------------------------*/
DSTATUS disk_initialize(BYTE pdrv)
{

    switch (pdrv) {
    case DEV_NORFLASH:
#if USE_SFUD
        // 初始化SFUD
        if (sfud_init() == SFUD_SUCCESS) {
            return RES_OK;  // 初始化成功，返回就绪
        }
#else
        //		    uint8_t mid = 0;
        //				uint16_t did = 0;
        //        NorFlashDrvInit();
        //        ReadNorflashID(&mid, &did);
        //        if (((uint32_t)mid << 16 | did) == NORFLASH_MID_DID) {
        //            return RES_OK;
        //        }
#endif
    }
    return RES_NOTRDY; // 其他驱动器未支持
}

/*-----------------------------------------------------------------------*/
/* 读取扇区数据                                                          */
/*-----------------------------------------------------------------------*/
DRESULT disk_read(
    BYTE pdrv,		/* 驱动器号 */
    BYTE* buff,		/* 接收缓冲区 */
    LBA_t sector,	/* 起始扇区（LBA） */
    UINT count		/* 读取扇区数 */
)
{
    switch (pdrv) {
    case DEV_NORFLASH:
#if USE_SFUD
    {
        sfud_err sfud_res = sfud_read(sfud_get_device(SFUD_GD25Q128E_DEVICE_INDEX), sector * DEV_NORFLASH_SECTOR_SIZE, count * DEV_NORFLASH_SECTOR_SIZE, buff);
        if (sfud_res != SFUD_SUCCESS) return RES_ERROR;
        return RES_OK;
    }
#else
        ReadNorflashData(sector * DEV_NORFLASH_SECTOR_SIZE, buff, count * DEV_NORFLASH_SECTOR_SIZE);
        return RES_OK;
#endif
    }
    return RES_PARERR;
}

/*-----------------------------------------------------------------------*/
/* 写入扇区数据                                                          */
/*-----------------------------------------------------------------------*/
#if FF_FS_READONLY == 0
DRESULT disk_write(
    BYTE pdrv,			/* 驱动器号 */
    const BYTE* buff,	/* 待写入数据 */
    LBA_t sector,		/* 起始扇区（LBA） */
    UINT count			/* 写入扇区数 */
)
{
    switch (pdrv) {
    case DEV_NORFLASH:
#if USE_SFUD
    {
        sfud_err sfud_res = sfud_erase_write(sfud_get_device(SFUD_GD25Q128E_DEVICE_INDEX), sector * DEV_NORFLASH_SECTOR_SIZE, count * DEV_NORFLASH_SECTOR_SIZE, buff);
        if (sfud_res != SFUD_SUCCESS) return RES_ERROR;
        return RES_OK;
    }
#else
        WriteNorflashData(sector * NORFLASH_SECTOR_SIZE, (uint8_t*)buff, count * NORFLASH_SECTOR_SIZE);
        return RES_OK;
#endif
    }
    return RES_PARERR;
}
#endif

/*-----------------------------------------------------------------------*/
/* 杂项控制函数                                                          */
/*-----------------------------------------------------------------------*/
DRESULT disk_ioctl(
    BYTE pdrv,		/* Physical drive nmuber (0..) */
    BYTE cmd,		/* Control code */
    void* buff		/* Buffer to send/receive control data */
)
{
//    if (buff == NULL) {
//        return RES_PARERR; // 缓冲区为空，参数错误
//    }

    switch (pdrv) {
    case DEV_NORFLASH:
        switch (cmd) {
        case GET_SECTOR_COUNT:
            *(DWORD*)buff = NORFLASH_SECTOR_COUNT;
            break;
        case GET_SECTOR_SIZE:
            *(WORD*)buff = NORFLASH_SECTOR_SIZE;
            break;
        }
        return RES_OK;
    }

    return RES_PARERR;
}
/*-----------------------------------------------------------------------*/
/* 获取文件时间戳（可选）                                                */
/*-----------------------------------------------------------------------*/
DWORD get_fattime(void)
{
    return 0; // 不需要时间戳时返回0
}
